// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "ini.h"
#include "SimpleINIBPLibrary.generated.h"

/* 
*	Function library class.
*	Each function in it is expected to be static and represents blueprint node that can be called in any blueprint.
*
*	When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable.
*	BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins.
*	BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins.
*	DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu.
*				Its lets you name the node using characters not allowed in C++ function names.
*	CompactNodeTitle - the word(s) that appear on the node.
*	Keywords -	the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. 
*				Good example is "Print String" node which you can find also by using keyword "log".
*	Category -	the category your node will be under in the Blueprint drop-down menu.
*
*	For more info on custom blueprint nodes visit documentation:
*	https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation
*/
UCLASS()
class SIMPLEINI_API USimpleINIBPLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_UCLASS_BODY()

	//UFUNCTION(BlueprintCallable, meta = (DisplayName = "Execute Sample function", Keywords = "SimpleINI sample test testing"), Category = "SimpleINITesting")
	//static float SimpleINISampleFunction(float Param);

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool LoadIniFile( const FString& FilePath );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool GetValue( const FString& FilePath, const FString& SectionName, const FString& Key, FString& Value, bool& IsValid );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool SetValue( const FString& FilePath, const FString& SectionName, const FString& Key, const FString& Value );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool SaveIniFile( const FString& FilePath );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool ReloadIniFile( const FString& FilePath );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool SectionExists( const FString& FilePath, const FString& SectionName );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool KeyExists( const FString& FilePath, const FString& SectionName, const FString& Key );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool GetSectionKeys( const FString& FilePath, const FString& SectionName, TArray<FString>& Keys );

	UFUNCTION( BlueprintCallable, meta = (Keywords = "ini"), Category = "SimpleINI" )
		static bool GetSectionContent( const FString& FilePath, const FString& SectionName, TArray<FString>& Keys, TArray<FString>& Values, TArray<bool>& Valids );

	static TSharedPtr<IniFile> FindFileOpened( const FString& FilePath );

private:
	static TArray<TSharedPtr<IniFile>> INIs;
};
